<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.10.0" />
<title>silk.tasks.training.supervised_keypoint API documentation</title>
<meta name="description" content="" />
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>silk.tasks.training.supervised_keypoint</code></h1>
</header>
<section id="section-intro">
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python"># Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.

# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.

import warnings
from typing import Union

import torch
import torch.nn as nn
from silk.flow import Flow
from silk.transforms.abstract import Transform


class Training:
    def __init__(self, batch_to_training_loss_fn, batch_to_validation_loss_fn) -&gt; None:
        self._batch_to_training_loss_fn = batch_to_training_loss_fn
        self._batch_to_validation_loss_fn = batch_to_validation_loss_fn

    @property
    def batch_to_training_loss_fn(self):
        return self._batch_to_training_loss_fn

    @property
    def batch_to_validation_loss_fn(self):
        return self._batch_to_validation_loss_fn


class SupervisedKeypoint(Training, torch.nn.Module):
    &#34;&#34;&#34;Supervised Keypoint Learning
    Reponsibilities :
    - Data Augmentations
    - Loss

    Provide a map from batch to both validation and training losses.
    &#34;&#34;&#34;

    def __init__(
        self,
        batch_to_images_and_labels_fn,
        images_to_logits_fn,
        image_aug_transform: Union[Transform, None] = None,
    ):
        # AutoForward.__init__(self, Flow(&#34;batch&#34;), &#34;validation_loss&#34;)
        torch.nn.Module.__init__(self)

        # loss function
        self._loss = nn.CrossEntropyLoss()
        self._image_aug_transform = image_aug_transform

        self._flow = Flow(&#34;batch&#34;)
        self._flow.define_transition(
            (&#34;images&#34;, &#34;labels&#34;),
            batch_to_images_and_labels_fn,
            &#34;batch&#34;,
        )
        self._flow.define_transition(
            &#34;augmented_images&#34;,
            self.image_aug_transform,
            &#34;images&#34;,
        )
        self._flow.define_transition(&#34;logits&#34;, images_to_logits_fn, &#34;images&#34;)
        self._flow.define_transition(
            &#34;augmented_logits&#34;,
            images_to_logits_fn,
            &#34;augmented_images&#34;,
        )
        self._flow.define_transition(&#34;validation_loss&#34;, self._loss, &#34;logits&#34;, &#34;labels&#34;)
        self._flow.define_transition(
            &#34;training_loss&#34;,
            self._loss,
            &#34;augmented_logits&#34;,
            &#34;labels&#34;,
        )

        # self._batch_to_validation_loss_fn = self._flow.with_outputs(&#34;validation_loss&#34;)
        # self._batch_to_training_loss_fn = self._flow.with_outputs(&#34;training_loss&#34;)

        Training.__init__(
            self,
            self._flow.with_outputs(&#34;training_loss&#34;),
            self._flow.with_outputs(&#34;validation_loss&#34;),
        )

    def forward(self, x):
        return x

    def image_aug_transform(self, images: torch.Tensor) -&gt; torch.Tensor:
        if self._image_aug_transform is None:
            warnings.warn(
                &#34;The Supervised Keypoint&#39;s training task is running without image augmentation. This could greatly reduce the model&#39;s performance.&#34;,
                UserWarning,
            )
            return images
        return self._image_aug_transform(images)</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-classes">Classes</h2>
<dl>
<dt id="silk.tasks.training.supervised_keypoint.SupervisedKeypoint"><code class="flex name class">
<span>class <span class="ident">SupervisedKeypoint</span></span>
<span>(</span><span>batch_to_images_and_labels_fn, images_to_logits_fn, image_aug_transform: Optional[<a title="silk.transforms.abstract.Transform" href="../../transforms/abstract.html#silk.transforms.abstract.Transform">Transform</a>] = None)</span>
</code></dt>
<dd>
<div class="desc"><p>Supervised Keypoint Learning
Reponsibilities :
- Data Augmentations
- Loss</p>
<p>Provide a map from batch to both validation and training losses.</p>
<p>Initializes internal Module state, shared by both nn.Module and ScriptModule.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class SupervisedKeypoint(Training, torch.nn.Module):
    &#34;&#34;&#34;Supervised Keypoint Learning
    Reponsibilities :
    - Data Augmentations
    - Loss

    Provide a map from batch to both validation and training losses.
    &#34;&#34;&#34;

    def __init__(
        self,
        batch_to_images_and_labels_fn,
        images_to_logits_fn,
        image_aug_transform: Union[Transform, None] = None,
    ):
        # AutoForward.__init__(self, Flow(&#34;batch&#34;), &#34;validation_loss&#34;)
        torch.nn.Module.__init__(self)

        # loss function
        self._loss = nn.CrossEntropyLoss()
        self._image_aug_transform = image_aug_transform

        self._flow = Flow(&#34;batch&#34;)
        self._flow.define_transition(
            (&#34;images&#34;, &#34;labels&#34;),
            batch_to_images_and_labels_fn,
            &#34;batch&#34;,
        )
        self._flow.define_transition(
            &#34;augmented_images&#34;,
            self.image_aug_transform,
            &#34;images&#34;,
        )
        self._flow.define_transition(&#34;logits&#34;, images_to_logits_fn, &#34;images&#34;)
        self._flow.define_transition(
            &#34;augmented_logits&#34;,
            images_to_logits_fn,
            &#34;augmented_images&#34;,
        )
        self._flow.define_transition(&#34;validation_loss&#34;, self._loss, &#34;logits&#34;, &#34;labels&#34;)
        self._flow.define_transition(
            &#34;training_loss&#34;,
            self._loss,
            &#34;augmented_logits&#34;,
            &#34;labels&#34;,
        )

        # self._batch_to_validation_loss_fn = self._flow.with_outputs(&#34;validation_loss&#34;)
        # self._batch_to_training_loss_fn = self._flow.with_outputs(&#34;training_loss&#34;)

        Training.__init__(
            self,
            self._flow.with_outputs(&#34;training_loss&#34;),
            self._flow.with_outputs(&#34;validation_loss&#34;),
        )

    def forward(self, x):
        return x

    def image_aug_transform(self, images: torch.Tensor) -&gt; torch.Tensor:
        if self._image_aug_transform is None:
            warnings.warn(
                &#34;The Supervised Keypoint&#39;s training task is running without image augmentation. This could greatly reduce the model&#39;s performance.&#34;,
                UserWarning,
            )
            return images
        return self._image_aug_transform(images)</code></pre>
</details>
<h3>Ancestors</h3>
<ul class="hlist">
<li><a title="silk.tasks.training.supervised_keypoint.Training" href="#silk.tasks.training.supervised_keypoint.Training">Training</a></li>
<li>torch.nn.modules.module.Module</li>
</ul>
<h3>Class variables</h3>
<dl>
<dt id="silk.tasks.training.supervised_keypoint.SupervisedKeypoint.dump_patches"><code class="name">var <span class="ident">dump_patches</span> : bool</code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="silk.tasks.training.supervised_keypoint.SupervisedKeypoint.training"><code class="name">var <span class="ident">training</span> : bool</code></dt>
<dd>
<div class="desc"></div>
</dd>
</dl>
<h3>Methods</h3>
<dl>
<dt id="silk.tasks.training.supervised_keypoint.SupervisedKeypoint.forward"><code class="name flex">
<span>def <span class="ident">forward</span></span>(<span>self, x) ‑> Callable[..., Any]</span>
</code></dt>
<dd>
<div class="desc"><p>Defines the computation performed at every call.</p>
<p>Should be overridden by all subclasses.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Although the recipe for forward pass needs to be defined within
this function, one should call the :class:<code>Module</code> instance afterwards
instead of this since the former takes care of running the
registered hooks while the latter silently ignores them.</p>
</div></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def forward(self, x):
    return x</code></pre>
</details>
</dd>
<dt id="silk.tasks.training.supervised_keypoint.SupervisedKeypoint.image_aug_transform"><code class="name flex">
<span>def <span class="ident">image_aug_transform</span></span>(<span>self, images: torch.Tensor) ‑> torch.Tensor</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def image_aug_transform(self, images: torch.Tensor) -&gt; torch.Tensor:
    if self._image_aug_transform is None:
        warnings.warn(
            &#34;The Supervised Keypoint&#39;s training task is running without image augmentation. This could greatly reduce the model&#39;s performance.&#34;,
            UserWarning,
        )
        return images
    return self._image_aug_transform(images)</code></pre>
</details>
</dd>
</dl>
</dd>
<dt id="silk.tasks.training.supervised_keypoint.Training"><code class="flex name class">
<span>class <span class="ident">Training</span></span>
<span>(</span><span>batch_to_training_loss_fn, batch_to_validation_loss_fn)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class Training:
    def __init__(self, batch_to_training_loss_fn, batch_to_validation_loss_fn) -&gt; None:
        self._batch_to_training_loss_fn = batch_to_training_loss_fn
        self._batch_to_validation_loss_fn = batch_to_validation_loss_fn

    @property
    def batch_to_training_loss_fn(self):
        return self._batch_to_training_loss_fn

    @property
    def batch_to_validation_loss_fn(self):
        return self._batch_to_validation_loss_fn</code></pre>
</details>
<h3>Subclasses</h3>
<ul class="hlist">
<li><a title="silk.tasks.training.supervised_keypoint.SupervisedKeypoint" href="#silk.tasks.training.supervised_keypoint.SupervisedKeypoint">SupervisedKeypoint</a></li>
</ul>
<h3>Instance variables</h3>
<dl>
<dt id="silk.tasks.training.supervised_keypoint.Training.batch_to_training_loss_fn"><code class="name">var <span class="ident">batch_to_training_loss_fn</span></code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@property
def batch_to_training_loss_fn(self):
    return self._batch_to_training_loss_fn</code></pre>
</details>
</dd>
<dt id="silk.tasks.training.supervised_keypoint.Training.batch_to_validation_loss_fn"><code class="name">var <span class="ident">batch_to_validation_loss_fn</span></code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@property
def batch_to_validation_loss_fn(self):
    return self._batch_to_validation_loss_fn</code></pre>
</details>
</dd>
</dl>
</dd>
</dl>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="silk.tasks.training" href="index.html">silk.tasks.training</a></code></li>
</ul>
</li>
<li><h3><a href="#header-classes">Classes</a></h3>
<ul>
<li>
<h4><code><a title="silk.tasks.training.supervised_keypoint.SupervisedKeypoint" href="#silk.tasks.training.supervised_keypoint.SupervisedKeypoint">SupervisedKeypoint</a></code></h4>
<ul class="">
<li><code><a title="silk.tasks.training.supervised_keypoint.SupervisedKeypoint.dump_patches" href="#silk.tasks.training.supervised_keypoint.SupervisedKeypoint.dump_patches">dump_patches</a></code></li>
<li><code><a title="silk.tasks.training.supervised_keypoint.SupervisedKeypoint.forward" href="#silk.tasks.training.supervised_keypoint.SupervisedKeypoint.forward">forward</a></code></li>
<li><code><a title="silk.tasks.training.supervised_keypoint.SupervisedKeypoint.image_aug_transform" href="#silk.tasks.training.supervised_keypoint.SupervisedKeypoint.image_aug_transform">image_aug_transform</a></code></li>
<li><code><a title="silk.tasks.training.supervised_keypoint.SupervisedKeypoint.training" href="#silk.tasks.training.supervised_keypoint.SupervisedKeypoint.training">training</a></code></li>
</ul>
</li>
<li>
<h4><code><a title="silk.tasks.training.supervised_keypoint.Training" href="#silk.tasks.training.supervised_keypoint.Training">Training</a></code></h4>
<ul class="">
<li><code><a title="silk.tasks.training.supervised_keypoint.Training.batch_to_training_loss_fn" href="#silk.tasks.training.supervised_keypoint.Training.batch_to_training_loss_fn">batch_to_training_loss_fn</a></code></li>
<li><code><a title="silk.tasks.training.supervised_keypoint.Training.batch_to_validation_loss_fn" href="#silk.tasks.training.supervised_keypoint.Training.batch_to_validation_loss_fn">batch_to_validation_loss_fn</a></code></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc" title="pdoc: Python API documentation generator"><cite>pdoc</cite> 0.10.0</a>.</p>
</footer>
</body>
</html>